package com.cskaoyan.javase.array._8yanghui;

import java.util.Arrays;

/**
 * 杨辉三角（YangHui Triangle）指的是南宋时期数学家杨辉，根据北宋时期的数学家贾宪的作品（现已遗失），发现的一种几何排列规律，在数学中，它是二项式系数在三角形中的一种几何排列。大致图案如下：
 *
 * 1
 * 1 1
 * 1 2 1
 * 1 3 3 1
 * 1 4 6 4 1
 * 1 5 10 10 5 1
 * ........
 *
 * 观察一下杨辉三角的排列规律，思考它和二维数组有什么联系？
 * 把杨辉三角每一行的数据看成是一个一维数组，那么这么多行（也就是很多一维数组）组合起来，就是一个二维数组。
 *
 * @since 09:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        printYangHui(10);
    }

    /**
     *  该方法打印line行杨辉三角图案
     * @param line 杨辉三角的行数
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/04 9:41
     */
    public static void printYangHui(int line) {
        /*
            分析思路:
                1.声明初始化一个二维数组,用来存放杨辉三角的数据
                2.赋值.将杨辉三角的数据按照规律赋值进二维数组
                3.按照杨辉三角的规律遍历打印数据,展示杨辉三角
         */

        // 1.声明初始化一个二维数组,用来存放杨辉三角的数据
        // 1.1使用动态初始化格式二来初始化int类型二维数组
        // 二维数组的长度就是杨辉三角的行数
        int[][] yangHui = new int[line][];

        // 1.2上述二维数组里面只有默认值null,不能直接使用,需要先初始化其中的一维数组
        // 这里是对二维数组做一层for循环,循环中遍历的是每一个一维数组
        for (int i = 0; i < yangHui.length; i++) {
            // 给一维数组初始化
            yangHui[i] = new int[i + 1];
        }
        // 以上完成二维数组的初始化,可以开始进行赋值了!
        // 打印这个二维数组,查看效果
        System.out.println(Arrays.deepToString(yangHui));

        // 2.赋值.将杨辉三角的数据按照规律赋值进二维数组
        /*
            总结杨辉三角数据的规律
                1.前两行元素都是1
                2.从第三行开始,每行的首尾元素都是1
                3.从第三行开始,每行的中间元素等于上一行的同列元素 + 上一行的左边一列元素
                用表达式描述
                对于二维数组arr,中间的某个元素arr[i][j]
                arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
         */
        // 2.1前两行元素都是1
        yangHui[0][0] = 1;
        yangHui[1][0] = 1;
        yangHui[1][1] = 1;
        System.out.println(Arrays.deepToString(yangHui));

        // 2.2从第三行开始,每行的首尾元素都是1
        for (int i = 2; i < yangHui.length; i++) {
            yangHui[i][0] = 1;
            yangHui[i][yangHui[i].length - 1] = 1;
        }
        System.out.println(Arrays.deepToString(yangHui));

        // 2.3从第三行开始,每行的中间元素(排除首尾元素)等于上一行的同列元素 + 上一行的左边一列元素
        // arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
        for (int i = 2; i < yangHui.length; i++) {
            for (int j = 1; j < yangHui[i].length - 1; j++) {
                // 双层for遍历的是二维数组中的元素
                yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
            }
        }
        System.out.println(Arrays.deepToString(yangHui));

        System.out.println("----------------------------------------------------");
        // 3.按照杨辉三角的规律遍历打印数据,展示杨辉三角
        for (int[] ints : yangHui) {
            for (int ele : ints) {
                System.out.print(ele + "\t");
            }
            System.out.println();
        }
    }
}
